import axios from 'axios'
import util from './util'

//axios 配置
axios.defaults.timeout = 5000;
//axios.defaults.baseURL = "" //这是调用数据接口

/**
 * http request 拦截器
 * @作用： 在拦截器中增加headers属性，拦截器的作用就是当你调用接口的时候它会做判断
 * 通过这个，我们就可以把cookie传到后台
 * 跨域的话，客户端设置了跨域头，服务器端也必须设置跨域才行
 * 服务器跨域函数：
 * public function cross() {
 *  header('Access-Control-Allow-Origin:*');
 *  header('Access-Control-Allow-Methods:GET,POST,PATCH,PUT,OPTIONS');
 * }
 */
axios.interceptors.request.use (
    config => {
        console.log('http request 拦截成功');
        const token = util.Cookie.get('session');
        config.data = JSON.stringify(config.data);
        config.headers = {
            'Content-Type':'application/x-www-form-urlencoded' //设置跨域头部
        }
        if(token) {
            config.params = {'token': token} //后台接收的参数，后面我们将说明后台如何接收
        }
        return config;
    },
    err => {
        console.log('http request 拦截失败');
        return Promise.reject(err);
    }
)

/**
 * http response 拦截器
 * 
*/
axios.interceptors.response.use (
    response => {
        console.log('http response 拦截成功');
        debugger;
        //response.data.errCode是我接口返回的值，如果值为2，说明cookie丢失，然后跳转到登录页面
        if(response.data.errCode == 2) {
            router.push({
                path: '/login',
                query: {redirect: router.currentRoute.fullPath} //从哪个页面跳转的
            })
        }
        return response;
    },
    err => {
        debugger;
        console.log('http response 拦截失败');
        return Promise.reject(err.response.data);
    }
)

/**
 * 根据axios封装http请求方法
 * @[function]
 */
/**
 * fetch请求方法
 * @param url
 * @param params
 * @return {Promise}
 */
function fetch(url, params = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params
        }).then(result => {
            resolve(result.data)
        }).catch(err => {
            reject(err)
        })
    })
}
/**
 * post请求方法
 * @param url
 * @param data
 * @return {Promise}
*/
function post(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.post(url, data).then(result => {
            resolve(result.data)
        }).catch(err => {
            reject(err)
        })
    })
}
/**
 * patch方法
 * @param url
 * @param data
 * @return {Promise}
*/
function patch(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.patch(url, data).then(result => {
            resolve(result.data)
        }).catch(err => {
            reject(err)
        })
    })
}
/**
 * put 方法
 * @param url
 * @param data
 * @return {Promise}
*/
function put(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.put(url, data).then(result => {
            resolve(result.data);
        }).catch(err => {
            reject(err);
        })
    })
}